package LimitedTimeGame.Day_0216;

/**
 * @author zxc
 * @date 2023/02/16 09:06
 **/

/**
 * 题目 ：球会落在何处
 * 题目详述 ：
 * 用一个大小为 m x n 的二维网格 grid 表示一个箱子。你有 n 颗球。箱子的顶部和底部都是开着的。
 * 箱子中的每个单元格都有一个对角线挡板，跨过单元格的两个角，可以将球导向左侧或者右侧。
 * 将球导向右侧的挡板跨过左上角和右下角，在网格中用 1 表示。
 * 将球导向左侧的挡板跨过右上角和左下角，在网格中用 -1 表示。
 * 在箱子每一列的顶端各放一颗球。每颗球都可能卡在箱子里或从底部掉出来。
 * 如果球恰好卡在两块挡板之间的 "V" 形图案，或者被一块挡导向到箱子的任意一侧边上，就会卡住。
 * 返回一个大小为 n 的数组 answer ，
 * 其中 answer[i] 是球放在顶部的第 i 列后从底部掉出来的那一列对应的下标，如果球卡在盒子里，则返回 -1 。
 *
 * 提示：
 * m == grid.length
 * n == grid[i].length
 * 1 <= m, n <= 100
 * grid[i][j] 为 1 或 -1
 *
 */
public class FindBall {
    public static void main(String[] args) {
        findBall(new int[][]{{1,1,1,-1,-1},{1,1,1,-1,-1},{-1,-1,-1,1,1},{1,1,1,1,-1},{-1,-1,-1,-1,-1}});
    }
    /**
     * 思路 ：
     * 即，对于每一个球都进行情况讨论
     * @param grid
     * @return
     */
    public static int[] findBall(int[][] grid) {
        // 获取球的个数;
        int number = grid[0].length;
        // 获取当前箱子的高度
        int height = grid.length;
        // 结果数组，用来存储所有球的可能情况;
        int[] result = new int[number];
//        for(int i = 0 ; i < number ; i++){
        int temp = number;
        while(temp > 0){
            // 代表坐标的横坐标;
            int location_i = temp - 1;
            // 代表坐标的纵坐标;
            int location_j = 0;
            // ===》当前坐标的表示方式 ：(location_j , location_i);
            while(location_j < height){
//                System.out.println(location_j + " " + location_i);
                // 若是当前小球所在位置是 左上角-右下角的话，
                if(grid[location_j][location_i] == 1){
                    if(location_i == number - 1 || grid[location_j][location_i + 1] == -1){
                        break;
                    }
                    location_i++;
                    location_j++;
                }
                // 若是当前小球位置是 右上角-左下角的话，
                else{
                    if(location_i == 0 || grid[location_j][location_i - 1] == 1){
                        break;
                    }
                    location_i--;
                    location_j++;
                }
            }
            // result数组中的值，由小球是否到达箱子的底部进行决定，
            // 若是到达箱子底部的话，则选择相result数组对应下标中存入location_i（即，小球到达底部的横坐标）
            result[temp - 1] = (location_j == height) ? location_i : -1;
            temp--;
        }
        return result;
    }
}
